La transición de los macros de estilo C a literales seguros por tipo en C++ representa un cambio fundamental en la usabilidad del lenguaje, resolviendo el "problema del NULL" donde la ambigüedad del macro cero provoca errores lógicos silenciosos.
1. El fallo en la resolución de sobrecarga
En los estándares antiguos (C++98), NULL a menudo se define como 0. Cuando se pasa a funciones sobrecargadas, el compilador lo interpreta como NULL un entero. Esto queda demostrado por:
std::cout << "NULL es un int";
2. La solución con nullptr
C++11 introdujo nullptr, una palabra clave de tipo std::nullptr_t. A diferencia del macro, no puede convertirse implícitamente a un tipo integral (excepto bool), asegurando que se seleccionen las sobrecargas específicas para punteros.
3. Vinculación y interoperabilidad
C++ moderno requiere extern "C" para evitar la manipulación de nombres al vincular con código C (por ejemplo, compilado con gcc). Mantener punteros seguros por tipo en este límite es crítico.
$$\text{std::nullptr\_t} \neq \text{int}$$